home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / 68hc11 / smallc11.arc / CC21.C < prev    next >
Text File  |  1987-02-16  |  3KB  |  168 lines

  1. junk()    {
  2.   if(an(inbyte())) while(an(ch))  gch();
  3.   else while(an(ch)==0) {
  4.      if(ch==0)break;
  5.      gch();
  6.      }
  7.   blanks();
  8.   }
  9.  
  10. endst()  {
  11. blanks();
  12. return ((streq(lptr,";")|(ch==0)));
  13. }
  14.  
  15. needtoken(str)    char *str;  {
  16.    if (match(str)==0) error("missing token");
  17.    }
  18.  
  19. findglb(sname)    char *sname; {
  20.    cptr=STARTGLB;
  21.    while(cptr < glbptr)  {
  22.       if(astreq(sname,cptr+NAME,NAMEMAX)) return(cptr);
  23.       cptr=nextsym(cptr);
  24.       }
  25.    return 0;
  26.    }
  27.  
  28. findloc(sname)
  29. char *sname;
  30. {
  31.  
  32. cptr= locptr - 1; /* search backward for block locals */
  33. while(cptr > STARTLOC)    {
  34.      cptr = cptr - *cptr;
  35.      if(astreq(sname,cptr,NAMEMAX)) return (cptr - NAME);
  36.      cptr = cptr - NAME - 1;
  37.      }
  38. return NO;
  39. }
  40.  
  41. addsym(sname, id, typ, value, lgptrptr, class)
  42. char    *sname;
  43. int    id, typ, value, *lgptrptr, class;
  44. {
  45.  
  46.   if(lgptrptr == &glbptr) {
  47.     if(cptr2=findglb(sname)) return cptr2;
  48.     if(glbptr >= ENDGLB) {
  49.       error("global symbol table overflow");
  50.       return NO;
  51.       }
  52.     cptr= *lgptrptr;
  53.     }
  54.   else {
  55.     if(locptr > (ENDLOC-SYMMAX)) {
  56.       printf("**** SMALL-C: local symbol table overflow ****\n");
  57.       exit(-1);
  58.       }
  59.     cptr= *lgptrptr;
  60.     }
  61.   cptr[IDENT]=id;
  62.   cptr[TYPE]=typ;
  63.   cptr[CLASS]=class;
  64.   putint(value, cptr+OFFSET, OFFSIZE);
  65.   cptr3 = cptr2 = cptr + NAME;
  66.   while(an(*sname)) *cptr2++ = *sname++;
  67.   *cptr2 = cptr2 - cptr3;      /* set length */
  68.   *lgptrptr = ++cptr2;
  69.   return cptr;
  70.   }
  71.  
  72. nextsym(zentry) char *zentry; {
  73.   zentry = zentry + NAME;
  74.   while(*zentry++ >= ' '); /* find length byte */
  75.   return zentry;
  76.   }
  77.  
  78. /*
  79. ** get integer of length len from address addr
  80. ** (byte sequence set by "putint")
  81. */
  82. getint(addr, len) char *addr; int len; {
  83.   int i;
  84.   i = *(addr + --len);    /* high order byte sign extended */
  85.   while(len--) i = (i << 8) | *(addr+len)&255;
  86.   return i;
  87.   }
  88.  
  89. /*
  90. ** put integer i of length len into address addr
  91. ** (low byte first)
  92. */
  93. putint(i, addr, len) char *addr; int i, len; {
  94.   while(len--) {
  95.     *addr++ = i;
  96.     i = i>>8;
  97.     }
  98.   }
  99.  
  100. /*
  101. ** test if next input string is legal symbol name
  102. */
  103. symname(sname, ucase) char *sname; int ucase; {
  104.   int k;char c;
  105.   blanks();
  106.   if(alpha(ch)==0) return 0;
  107.   k=0;
  108.   while(an(ch)) {
  109.       sname[k]=gch();
  110.     if(k<NAMEMAX) ++k;
  111.     }
  112.   sname[k]=0;
  113.   return 1;
  114.   }
  115.  
  116.  
  117. addwhile(ptr)  int ptr[]; {
  118.   int k;
  119.   ptr[WQSP]=csp;       /* and stk ptr */
  120.   ptr[WQLOOP]=getlabel();  /* and looping label */
  121.   ptr[WQEXIT]=getlabel();   /* and exit label */
  122.   if (wqptr==WQMAX) {
  123.     printf("**** SMALL-C: too many active loops ****\n");
  124.     exit(-1);
  125.     }
  126.   k=0;
  127.   while (k<WQSIZ) *wqptr++ = ptr[k++];
  128.   }
  129.  
  130. delwhile() {
  131.   if(readwhile()) wqptr=wqptr-WQSIZ;
  132.   }
  133.  
  134. readwhile() {
  135.   if (wqptr==wq) {
  136.     error("no active loops");
  137.     return 0;
  138.     }
  139.   else return (wqptr-WQSIZ);
  140.  }
  141.  
  142. inbyte()  {
  143.   while(ch==0) {
  144.     if (eof) return 0;
  145.     preprocess();
  146.     }
  147.   return gch();
  148.   }
  149.  
  150. inline()
  151. {
  152. int    k;
  153.  
  154. while(1)
  155.        {if(input2 == EOF)    /* no include file is open    */
  156.         { if(duanefgets(line, LINEMAX, stdin) == NULL)
  157.             eof=EOF;
  158.         bump(0); return;
  159.         }
  160.     else    { if(duanefgets(line, LINEMAX, input2)==NULL)
  161.             { fclose(input2);
  162.             input2=EOF;
  163.             }
  164.         bump(0); return;
  165.         }
  166.     }
  167. }
  168.